Home

Halo, selamat datang.

Saya Fakhrul Mu’minin, saya mahasiswa tingkat akhir jurusan sistem informasi di Universitas Nasional.

Ini adalah proyek penelitian tugas akhir saya dengan tujuan untuk memprediksi jumlah kunjungan wisatawan asing ke Indonesia dengan menggunakan tiga metode.

Sumber Data

Aplikasi ini menggunakan data bulanan jumlah kunjungan wisatawan mancanegara menurut pintu masuk melalui pintu udara dengan periode Januari 2017 sampai dengan Oktober 2021.

###All Libraries Used###
library(readxl)
library(modeltime)
library(tidyverse)
library(tidymodels)
library(timetk)
library(lubridate)
library(rmdformats)
library(DT)


###Data Preperation###
jkw <- read_excel("Jumlah-Wisman-Pintu-Udara.xlsx")

jkw[,c(4:20)] <- sapply(jkw[,c(4:20)], as.numeric)

jkw$Date <- as.Date(jkw$Date)

jkw %>% datatable()

Time Series Analysis

Grafik data di bawah ini menunjukkan visualisasi data time series jumlah kunjungan wisatawan mancanegara melalui pintu udara ke Indonesia.

###Time Series Analysis###
tspu <- jkw %>% select(Date, Total)

tspu %>% plot_time_series(Date, Total,
                          .title = "Jumlah Kunjungan Wisatawan Mancanegara Melalui Pintu Udara",
                          .x_lab = "Date",
                          .y_lab = "Jumlah Kunjungan")

Grafik diatas merupakan visualisasi dari data deret waktu :

  • Grafik menunjukkan data memiliki pola tren negatif karena mengalami penurunan yang disebabkan pandemi COVID-19

  • Pola tidak menunjukkan musiman dengan fluktuasi yang tidak teratur dalam beberapa tahun sebelum pandemi COVID-19

  • Jumlah kunjungan wisatawan mancanegara tertinggi pada bulan Juli 2018 yaitu 1.073.385 kunjungan dan terendah pada bulan Mei 2020 yaitu 506

  • Namun, di awal tahun 2020 mulai tidak menunjukkan pola yang positif, dikarenakan meningkatnya kasus COVID-19.

Forecasting

Pada penelitian ini menggunakan 3 metode yaitu ARIMA, Prophet, dan Glmnet.

###Split Data###
splits <- tspu %>%  time_series_split(
  assess = "23 months",
  cumulative = TRUE
)

splits %>% 
  tk_time_series_cv_plan() %>% 
  plot_time_series_cv_plan(Date, Total,
                           .title = "Pemisahan Data")

Pembagian data :

  • Data pelatihan diambil dari Januari 2017 hingga Desember 2019. Data pengujian digunakan untuk pengujian prediksi dan evaluasi akurasi

  • Data pengujian diambil dari Januari 2020 hingga November 2021. Data pembagian ini menunjukkan ada 36 titik data analisis (Analysis), 23 contoh yang berada di penilaian (Assess), 59 total titik data asli (Total). Data pelatihan digunakan untuk pemodelan

Model Comparison

Pada menu ini, perbandingan tiga metode yang digunakan untuk peramalan menggunakan fungsi library modeltime dilakukan.

###FORECASTING USING THREE MODEL###

# ARIMA
model_arima <- arima_reg() %>% 
  set_engine("auto_arima") %>% 
  fit(Total ~ Date, training(splits))
model_arima
## parsnip model object
## 
## Fit time:  530ms 
## Series: outcome 
## ARIMA(0,0,0)(0,1,0)[12] 
## 
## sigma^2 estimated as 4.197e+09:  log likelihood=-299.95
## AIC=601.89   AICc=602.07   BIC=603.07
# Prophet
model_prophet <- prophet_reg() %>% 
  set_engine("prophet") %>% 
  fit(Total ~ Date, training(splits))
model_prophet
## parsnip model object
## 
## Fit time:  1.6s 
## PROPHET Model
## - growth: 'linear'
## - n.changepoints: 25
## - changepoint.range: 0.8
## - yearly.seasonality: 'auto'
## - weekly.seasonality: 'auto'
## - daily.seasonality: 'auto'
## - seasonality.mode: 'additive'
## - changepoint.prior.scale: 0.05
## - seasonality.prior.scale: 10
## - holidays.prior.scale: 10
## - logistic_cap: NULL
## - logistic_floor: NULL
## - extra_regressors: 0
# GLMNET
model_glmnet <- linear_reg(penalty = 0.01) %>% 
  set_engine("glmnet") %>% 
  fit(Total ~ month(Date, label = TRUE) + 
        as.numeric(Date), training(splits))
model_glmnet
## parsnip model object
## 
## Fit time:  20ms 
## 
## Call:  glmnet::glmnet(x = maybe_matrix(x), y = y, family = "gaussian") 
## 
##    Df  %Dev Lambda
## 1   0  0.00  65730
## 2   1  6.71  59890
## 3   1 12.28  54570
## 4   1 16.90  49720
## 5   1 20.74  45310
## 6   1 23.93  41280
## 7   2 29.20  37610
## 8   2 33.60  34270
## 9   2 37.24  31230
## 10  3 41.53  28450
## 11  4 45.42  25930
## 12  6 50.21  23620
## 13  6 55.41  21520
## 14  6 59.73  19610
## 15  7 63.47  17870
## 16  7 66.94  16280
## 17  7 69.83  14840
## 18  7 72.22  13520
## 19  8 74.25  12320
## 20  8 76.14  11220
## 21  8 77.70  10230
## 22  9 79.00   9317
## 23  9 80.21   8489
## 24 10 81.23   7735
## 25 10 82.11   7048
## 26 10 82.85   6422
## 27 10 83.45   5851
## 28 11 84.00   5332
## 29 11 84.46   4858
## 30 11 84.85   4426
## 31 11 85.17   4033
## 32 11 85.43   3675
## 33 11 85.65   3348
## 34 11 85.83   3051
## 35 11 85.99   2780
## 36 11 86.11   2533
## 37 11 86.22   2308
## 38 11 86.30   2103
## 39 11 86.38   1916
## 40 11 86.44   1746
## 41 11 86.49   1591
## 42 11 86.53   1449
## 43 11 86.56   1321
## 44 11 86.59   1203
## 45 11 86.61   1096
## 46 11 86.63    999
## 47 11 86.65    910
## 48 11 86.66    829
## 49 11 86.67    756
## 50 11 86.68    689
## 51 11 86.69    627
## 52 11 86.70    572
## 53 11 86.70    521
## 54 11 86.71    475
## 55 11 86.71    432
## 56 11 86.71    394
## 57 11 86.72    359
## 58 11 86.72    327
## 59 11 86.72    298
## 60 11 86.72    272
## 61 11 86.72    248
## 62 11 86.72    226
## 63 11 86.72    206
###MODEL COMPARE###

# Modeltime Table #
model_tbl <- modeltime_table(
  model_arima,
  model_glmnet,
  model_prophet
)
model_tbl
## # Modeltime Table
## # A tibble: 3 x 3
##   .model_id .model   .model_desc            
##       <int> <list>   <chr>                  
## 1         1 <fit[+]> ARIMA(0,0,0)(0,1,0)[12]
## 2         2 <fit[+]> GLMNET                 
## 3         3 <fit[+]> PROPHET
###Calibrate###
calib_tbl <- model_tbl %>% 
  modeltime_calibrate(testing(splits))
calib_tbl
## # Modeltime Table
## # A tibble: 3 x 5
##   .model_id .model   .model_desc             .type .calibration_data
##       <int> <list>   <chr>                   <chr> <list>           
## 1         1 <fit[+]> ARIMA(0,0,0)(0,1,0)[12] Test  <tibble [23 x 4]>
## 2         2 <fit[+]> GLMNET                  Test  <tibble [23 x 4]>
## 3         3 <fit[+]> PROPHET                 Test  <tibble [23 x 4]>
###Test Visualization###

calib_tbl %>% 
  modeltime_forecast(actual_data = tspu) %>% 
  plot_modeltime_forecast(.title = "Hasil Prediksi",
                          .x_lab = "Date",
                          .y_lab = "Jumlah Kunjungan")

Grafik diatas menunjukkan perbandingan data aktual dengan data hasil prediksi tiga model :

  • Data hasil prediksi ditunjukkan dengan garis yang berwarna merah sebagai model ARIMA, biru sebagai model Glmnet, dan kuning sebagai model Prophet sedangkan data aktual ditunjukkan dengan garis berwarna biru tua gelap

  • Berdasarkan gambar 4 diketahui bahwa semua model tidak menunjukkan kinerja yang baik dan tidak menunjukkan pola yang sama pada data aktual karena pandemi COVID-19. Maka dari itu dilakukan pengujian akurasi evaluasi untuk menentukan model yang terbaik.

###Accuracy###
calib_tbl %>% modeltime_accuracy() %>% datatable()

Berdasarkan hasil dari semua model :

  • Bahwa model ARIMA memiliki kinerja yang baik dari dua model pembanding yang menunjukkan nilai terendah dari MAE sebesar 749030.4, MAPE sebesar 23196.45, MASE sebesar 17.86681, SMAPE sebesar 175.9592, dan RMSE sebesar 779670.7.

  • Model yang tidak cocok untuk data ini yaitu model Prophet dan Glmnet yang memiliki hasil yang kurang baik pada nilai MAE, MAPE, MASE, SMAPE, dan RMSE.

  • Model Prophet memiliki nilai RSQ sebesar 0.2075559 yang tertinggi dari model ARIMA dan Glmnet.

Future Forecast

Setelah membandingkan ketiga metode tersebut, pada menu ini dilakukan peramalan masa depan menggunakan data asli dengan tiga metode yaitu auto ARIMA, Prophet, dan Glmnet.

###FUTURE FORECAST###

future_forecast_tbl <- calib_tbl %>% 
  modeltime_refit(tspu) %>% 
  modeltime_forecast(
    h = "1 year",
    actual_data = tspu
  )

future_forecast_tbl %>% datatable()
future_forecast_tbl %>% 
  plot_modeltime_forecast(.title = "Hasil Prediksi",
                          .x_lab = "Date",
                          .y_lab = "Jumlah Kunjungan")

Berdasarkan hasil prediksi :

  • 12 bulan ke depan yaitu Desember 2021 hingga November 2022 menunjukkan jumlah kunjungan wisatawan mancanegara ke Indonesia melalui pintu udara cenderung mengalami peningkatan

  • Peningkatan terjadi pada bulan Desember 2021 sebesar 19.353 kunjungan. Namun, mengalami penurunan pada Januari 2022 menjadi sebesar 9.886 kunjungan

  • Setelah itu, mengalami kenaikan yang signifikan hingga April 2022 menjadi 103.127 kunjungan. Kemudian, mengalami fluktuasi hingga November 2022